﻿// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
// 本着色器用于在屏幕上绘制简单的圆形，演示了如何在 Unity 中实现自定义屏幕特效

Shader "ShaderToy/SimpleCircle"
{
	Properties
	{
		// 主纹理属性，虽然本例未直接使用
		_MainTex ("Texture", 2D) = "white" {}
	}
	SubShader
	{
		// 关闭剔除、深度写入和深度测试，确保始终渲染在最前面
		Cull Off ZWrite Off ZTest Always

		Pass
		{
			

			CGPROGRAM
			// 指定顶点和片元着色器入口
			#pragma vertex vert
			#pragma fragment frag
			ENDCG

			CGINCLUDE      
			// 引入 Unity 内置的 CG 库
			#include "UnityCG.cginc"     
			// 指定着色器目标为 3.0
			#pragma target 3.0        
			// 定义屏幕分辨率变量，等价于 _ScreenParams
			#define iResolution _ScreenParams  
			// 计算当前像素的屏幕坐标（类似 OpenGL 的 gl_FragCoord）
			#define gl_FragCoord ((_iParam.srcPos.xy/_iParam.srcPos.w)*_ScreenParams.xy)   
			
			// 类型别名，方便 GLSL 到 HLSL 的迁移
			#define vec4 float4  
			#define vec3 float3 
			#define vec2 float2 
			
			// 顶点输入结构体
			struct appdata
			{
				float4 vertex : POSITION; // 顶点位置
				float2 uv : TEXCOORD0;    // UV 坐标
				float4 srcPos : TEXCOORD1; // 屏幕空间位置
			};

			// 顶点到片元的输出结构体
			struct v2f
			{
				float2 uv : TEXCOORD0;      // 传递 UV
				float4 vertex : SV_POSITION; // 裁剪空间位置
				float4 srcPos : TEXCOORD1;  // 屏幕空间位置
			};

			// 顶点着色器：将模型空间顶点变换到裁剪空间，并计算屏幕空间位置
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex); // 变换到裁剪空间
				o.uv = v.uv;
				
				o.srcPos = ComputeScreenPos(o.vertex); // 计算屏幕空间位置
				return o;
			}
			
			// 主纹理采样器（本例未直接用到）
			sampler2D _MainTex;

			// 绘制圆形的函数
			// pos: 当前像素坐标
			// center: 圆心坐标
			// radius: 半径
			// color: 圆的颜色
			// antialias: 抗锯齿宽度
			vec4 circle(vec2 pos, vec2 center, float radius, float4 color,float antialias) 
			{  
				float d = length(pos - center) - radius; // 计算像素到圆心的距离并减去半径
				// 抗锯齿处理，边缘平滑
				float t = smoothstep(0, antialias, d);
				return vec4(color.xyz, 1-t); // 返回带透明度的颜色，圆内为不透明，边缘平滑过渡			
			}  
						
			// 片元着色器：在屏幕上绘制两个不同颜色的圆
			float4 frag (v2f _iParam) : COLOR
			{	
				// 计算当前像素的屏幕坐标 [0, 屏幕宽], [0, 屏幕高]
				float2 fragCoord = gl_FragCoord;  
							
				// 背景层，黑色
				vec4 layer1 = vec4(0,0,0, 1.0);
				// 绘制第一个红色圆，圆心在屏幕中心，半径100，抗锯齿宽度2
				vec4 layer2 = circle(fragCoord, vec2(_ScreenParams.xy/2.0f),100, float4(1,0,0,0),2); 
   
				// 将红色圆与背景混合
				vec4 circle1 =  lerp(layer1, layer2, layer2.a);  
				// 绘制第二个绿色圆，圆心在屏幕 1/3 处，半径100，抗锯齿宽度2
				vec4 layer3 = circle(fragCoord, vec2(_ScreenParams.xy/3.0f),100, float4(0,1,0,0),2); 
				
				// 将绿色圆与前一层混合
				vec4 circle2 =  lerp(circle1, layer3, layer3.a);  
				return circle2;
			} 
			ENDCG 
		}
	}
}